﻿// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using Newtonsoft.Json;

namespace Microsoft.DotNet.Cli.Installer.Windows;

/// <summary>
/// Defines the IPC message structure used to send commands from the unelevated client to the elevated server instance of
/// the installer
/// </summary>
internal class InstallRequestMessage : InstallMessageBase
{
    /// <summary>
    /// The dependent value to add or remove when updating reference counts.
    /// </summary>
    public string Dependent
    {
        get;
        set;
    }

    /// <summary>
    /// The path of the msi.json manifest.
    /// </summary>
    public string ManifestPath
    {
        get;
        set;
    }

    /// <summary>
    /// The contents of the install state file. Each element corresponds to a single line of
    /// the JSON file to be written.
    /// </summary>
    public Dictionary<string, string> InstallStateManifestVersions
    {
        get;
        set;
    }

    /// <summary>
    /// The path of the MSI log file to generate when installing, uninstalling or repairing a specific MSI.
    /// </summary>
    public string LogFile
    {
        get;
        set;
    }

    /// <summary>
    /// The package ID of the payload package that carries the MSI.
    /// </summary>
    public string PackageId
    {
        get;
        set;
    }

    /// <summary>
    /// The path of the MSI in the secure package cache.
    /// </summary>
    public string PackagePath
    {
        get;
        set;
    }

    /// <summary>
    /// The version of the payload package carrying the MSI.
    /// </summary>
    public string PackageVersion
    {
        get;
        set;
    }

    /// <summary>
    /// The product code of the MSI.
    /// </summary>
    public string ProductCode
    {
        get;
        set;
    }

    /// <summary>
    /// The provider key name used to track reference counts against an MSI.
    /// </summary>
    public string ProviderKeyName
    {
        get;
        set;
    }

    /// <summary>
    /// The type of the install message.
    /// </summary>
    public InstallRequestType RequestType
    {
        get;
        set;
    }

    /// <summary>
    /// The SDK feature band associated with a workload installation record.
    /// </summary>
    public string SdkFeatureBand
    {
        get;
        set;
    }

    /// <summary>
    /// The workload ID associated with a workload installation record.
    /// </summary>
    public string WorkloadId
    {
        get;
        set;
    }

    /// <summary>
    /// The new mode to use: workloadset or loosemanifests
    /// </summary>
    public bool? UseWorkloadSets
    {
        get; set;
    }

    /// <summary>
    /// The path to a global.json file that specified a workload set version
    /// </summary>
    public string GlobalJsonPath
    {
        get; set;
    }

    /// <summary>
    /// The workload set version
    /// </summary>
    public string WorkloadSetVersion
    {
        get; set;
    }

    /// <summary>
    /// Converts a deserialized array of bytes into an <see cref="InstallRequestMessage"/>.
    /// </summary>
    /// <param name="bytes">The array of bytes to convert.</param>
    /// <returns>An <see cref="InstallRequestMessage"/>.</returns>
    public static InstallRequestMessage Create(byte[] bytes)
    {
        string json = Encoding.UTF8.GetString(bytes);
        return JsonConvert.DeserializeObject<InstallRequestMessage>(json, DefaultSerializerSettings);
    }
}
